﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace GestorDeFlotas.Core
{
    public class Factura
    {
        public Cliente Cliente { get; set; }

        public decimal Importe { get; set; }

        public DateTime FechaInicio { get; set; }

        public DateTime FechaFin { get; set; }

        public Factura(Cliente cliente, decimal importe, DateTime fechaFactFin, DateTime fechaFactInicio)
        {
            this.Cliente = cliente;
            this.Importe = importe;
            this.FechaFin = fechaFactFin;
            this.FechaInicio = fechaFactInicio;
        }

        public void Facturar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction();

                try
                {
                    int idFactura = CrearFactura(connection, transaction);
                    InsertarItemsFactura(idFactura, connection, transaction);
                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }

        private void InsertarItemsFactura(int idFactura, SqlConnection connection, SqlTransaction transaction)
        {
            string sql = "INSERT INTO [CRAZY_TAXI].[TL_ItemsFactura] ([itfvia_id],[itffac_codigo],[itf_importe]) " +
                                           "SELECT via_id, " + idFactura.ToString() + ", (tur_valor_bandera + (tur_valor_ficha * via_cant_fichas)) " +
                                           "FROM [CRAZY_TAXI].[TL_VIAJES] " +
                                           "INNER JOIN [CRAZY_TAXI].[TL_TURNOS] AS T ON tur_id = viatur_id " +
                                           "WHERE via_fecha BETWEEN @FechaInicioFact AND @FechaFinFact " +
                                           "AND viacli_codigo = @Cliente ";

            SqlCommand insertarItemsFactura = SqlUtils.GetNewCommand(sql);

            SqlParameter paramCliente = new SqlParameter("@Cliente", SqlDbType.Int);
            paramCliente.IsNullable = false;
            paramCliente.Value = this.Cliente.Id;

            SqlParameter paramFechaFin = new SqlParameter("@FechaFinFact", SqlDbType.DateTime);
            paramFechaFin.IsNullable = false;
            paramFechaFin.Value = this.FechaFin;

            SqlParameter paramFechaInicio = new SqlParameter("@FechaInicioFact", SqlDbType.DateTime);
            paramFechaInicio.IsNullable = false;
            paramFechaInicio.Value = this.FechaInicio;

            insertarItemsFactura.Parameters.Add(paramCliente);
            insertarItemsFactura.Parameters.Add(paramFechaFin);
            insertarItemsFactura.Parameters.Add(paramFechaInicio);
            insertarItemsFactura.Connection = connection;
            insertarItemsFactura.Transaction = transaction;

            insertarItemsFactura.ExecuteNonQuery();
        }

        private int CrearFactura(SqlConnection connection, SqlTransaction transaction)
        {
            string sql = "INSERT INTO [CRAZY_TAXI].[TL_Facturas] ([fact_cliente], [fact_importeTotal], [fact_fecha_fin], [fact_fecha_inicio]) " +
                "OUTPUT INSERTED.fact_codigo " +
                "VALUES (@fact_cliente, @fact_importeTotal, @fact_fecha_fin, @fact_fecha_inicio)";

            SqlCommand crearFactura = SqlUtils.GetNewCommand(sql);

            SqlParameter paramCliente = new SqlParameter("@fact_cliente", SqlDbType.Int);
            paramCliente.IsNullable = false;
            paramCliente.Value = this.Cliente.Id;

            SqlParameter paramImporte = new SqlParameter("@fact_importeTotal", SqlDbType.Decimal);
            paramImporte.IsNullable = false;
            paramImporte.Value = this.Importe;

            SqlParameter paramFechaFin = new SqlParameter("@fact_fecha_fin", SqlDbType.DateTime);
            paramFechaFin.IsNullable = false;
            paramFechaFin.Value = this.FechaFin;

            SqlParameter paramFechaInicio = new SqlParameter("@fact_fecha_inicio", SqlDbType.DateTime);
            paramFechaInicio.IsNullable = false;
            paramFechaInicio.Value = this.FechaInicio;

            crearFactura.Parameters.Add(paramCliente);
            crearFactura.Parameters.Add(paramImporte);
            crearFactura.Parameters.Add(paramFechaFin);
            crearFactura.Parameters.Add(paramFechaInicio);
            crearFactura.Connection = connection;
            crearFactura.Transaction = transaction;
            
            return Convert.ToInt32(crearFactura.ExecuteScalar());
        }


    }
}
